package concurrent;

import java.util.*;

/**
 * 电脑病毒感染
 * 一个局域网内有很多台电脑，分别标注为0 - N-1的数字。相连接的电脑距离不一样，所以感染时间不一样，感染时间用t表示。
 * 其中网络内一个电脑被病毒感染，其感染网络内所有的电脑需要最少需要多长时间。如果最后有电脑不会感染，则返回-1
 * 给定一个数组times表示一个电脑把相邻电脑感染所用的时间。
 * 如图：path[i]= {i,j, t} 表示电脑i->j 电脑i上的病毒感染j，需要时间t。
 * <p>
 * 输入：
 * 4
 * 3
 * 2 1 1
 * 2 3 1
 * 3 4 1
 * 2
 * 输出：
 * 2
 * 第一个参数:局域网内电脑个数N 1<=N<=200;
 * 第二个参数：总共多少条网络连接
 * 第三个 1 2 1 表示1->2时间为1
 * 第七行：表示病毒最开始所在的电脑号1
 * <p>
 * 示例1：
 * 4
 * 3
 * 2 1 1
 * 2 3 1
 * 3 4 1
 * 2
 * 输出
 * 2
 */
public class Test3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //领接表
        HashMap<Integer, ArrayList<int[]>> graph = new HashMap<>();
        int m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();
            int w = scanner.nextInt();
            graph.putIfAbsent(u, new ArrayList<>());
            graph.get(u).add(new int[]{v, w});
        }
        //原点
        int src = scanner.nextInt();
        //记录原点到其他剩余的最短耗时
        int[] dist = new int[n + 1];
        //初始时，假设远点不可达其他剩余点，即原点到达其他点的耗时无限大
        Arrays.fill(dist, Integer.MAX_VALUE);

        //原点到达原点的耗时为0
        dist[src] = 0;
        PriorityQueue<Integer> needCheck = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        needCheck.add(src);

        boolean[] visited = new boolean[n + 1];
        visited[src] = true;

        while (needCheck.size() > 0) {
            int cur = needCheck.poll();
            visited[cur] = false;

            if (graph.containsKey(cur)) {
                for (int[] next : graph.get(cur)) {
                    int v = next[0];
                    int w = next[1];

                    int newDist = dist[cur] + w;
                    if (dist[v] > newDist) {
                        dist[v] = newDist;
                        if (!visited[v]) {
                            visited[v] = true;
                            needCheck.add(v);
                        }
                    }
                }
            }
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            ans = ans < dist[i] ? dist[i] : ans;
        }
        System.out.println(ans == Integer.MAX_VALUE ? -1 : ans);
    }
}

